Skip to content

feat: 添加 CUE 文件支持#72

Merged
imsyy merged 7 commits into
devfrom
codex/cue-support
Jul 6, 2026
Merged

feat: 添加 CUE 文件支持#72
imsyy merged 7 commits into
devfrom
codex/cue-support

Conversation

@imsyy

@imsyy imsyy commented Jul 6, 2026

Copy link
Copy Markdown
Member

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明)

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)

改动说明

添加 CUE 文件支持,包括:

  1. 解析 CUE 文件提取分轨信息(标题、艺术家、专辑、时间范围)
  2. 创建虚拟分轨路径(cue:// 协议),支持在曲库中显示独立分轨
  3. 隐藏被 CUE 分轨引用的容器整轨,避免重复显示
  4. 支持 CUE 分轨的播放、进度显示、跳转等功能
  5. 优化扫描过程,自动识别和处理 CUE 文件

主要变更:

  • 新增 electron/main/services/cue.ts:CUE 文件解析和虚拟路径生成
  • 修改 electron/main/services/scanner.ts:集成 CUE 文件扫描和分轨同步
  • 修改 electron/main/ipc/player.ts:支持 CUE 分轨的播放范围控制
  • 修改数据库迁移:添加 CUE 相关字段(cue_pathcue_audio_pathcue_start_mscue_end_ms
  • 修改 Rust 原生模块:支持 CUE 文件路径收集

关联 Issue

测试情况

手动测试:

  1. 扫描包含 CUE 文件的音乐文件夹,验证分轨正确显示
  2. 播放 CUE 分轨,验证进度条、时间显示、跳转功能正常
  3. 验证容器整轨被正确隐藏
  4. 验证标签编辑功能正常

截图 / 录屏

无 UI 改动

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动
  • 已在本地完整测试通过;AI 生成的代码同样自行测试并审阅过,未做未经验证的提交
  • 已运行 pnpm format,并确认 pnpm typecheckpnpm lint 通过
  • 改动涉及原生模块时已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

Copilot AI review requested due to automatic review settings July 6, 2026 07:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 在 SPlayer-Next 的本地曲库链路中引入 CUE 分轨支持:扫描阶段收集并解析 .cue 生成虚拟分轨(cue://),曲库展示时隐藏被引用的容器整轨;播放链路通过主进程对时间轴做“展示时间/引擎绝对时间”转换,并在渲染端基于分轨时长触发“结束结算/切歌”,从而让进度、跳转等行为对分轨成立。

Changes:

  • 扫描链路:Rust 扫描遍历时额外收集 CUE 文件路径,主进程收尾阶段解析并 upsert 虚拟分轨,同时清理过期分轨。
  • 播放链路:主进程按 CUE 分轨范围映射 position/duration,并在 seek/load 时做绝对时间换算;渲染端在分轨末尾触发结束逻辑。
  • UI/交互:文件树、播放源解析、右键菜单、标签编辑等对 CUE 虚拟分轨做兼容与限制(如禁止对分轨进行“编辑标签/删除文件”)。

Reviewed changes

Copilot reviewed 16 out of 17 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/utils/folderTree.ts CUE 分轨按真实容器音频路径归入磁盘目录树
src/services/audioSource.ts 本地播放源解析优先使用 cueAudioPath
src/core/player/events.ts 抽出结束结算逻辑,并在 CUE 分轨末尾用 position 事件触发
src/composables/useTrackMenu.ts CUE 分轨禁用标签编辑/删文件,且“在资源管理器中显示/复制路径”指向容器路径
src/components/modals/TagEditorDialog.vue 标签编辑对 CUE 分轨禁用加载,并显示容器文件名
shared/types/player.ts Track 新增 CUE 相关字段(path/范围/容器路径)
native/audio-engine/src/scanner.rs 遍历时收集 .cue 文件路径并随 done 事件上报
native/audio-engine/src/lib.rs 扫描 done 事件对外暴露 cueFiles
native/audio-engine/index.d.ts 同步更新扫描事件类型声明(cueFiles
electron/main/services/scanner.ts 扫描收尾阶段解析 CUE 并同步虚拟分轨到数据库
electron/main/services/cue.ts 新增 CUE 解析与虚拟路径生成逻辑
electron/main/services/cue.test.ts 覆盖单文件 CUE 解析与虚拟路径生成的单元测试
electron/main/ipc/player.ts 加入 CUE 分轨时间轴映射与 seek/load 范围处理
electron/main/ipc/library.ts 获取曲目时隐藏被 CUE 引用的容器整轨
electron/main/database/queries.ts 增加 CUE 字段映射与多处查询对容器整轨的排除逻辑
electron/main/database/migration.ts schema v4:新增 cue_* 列迁移
electron/main/database/index.ts tracks 表新增 cue_* 列并导出新查询方法

Comment on lines +120 to +128
} catch (error) {
libraryLog.warn(`解析 CUE 失败 [${cuePath}]:`, error);
}
}

if (upserts.length > 0) upsertTracks(upserts);
const stalePaths = getCueTrackPathsByDirs(dirs).filter((trackPath) => !nextPaths.has(trackPath));
if (stalePaths.length > 0) deleteTracksByPaths(stalePaths);
return nextPaths.size;
Copilot AI review requested due to automatic review settings July 6, 2026 10:27

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 17 changed files in this pull request and generated 1 comment.

Comment on lines +135 to +139
const stalePaths = getCueTrackPathsByDirs(dirs).filter((trackPath) => {
if (nextPaths.has(trackPath)) return false;
// 不可达目录下的分轨不删除
return !unavailableDirs.some((dir) => trackPath.startsWith(dir));
});
- 添加 extractCuePath 函数从虚拟路径提取真实 cuePath
- 使用真实 cuePath 做目录前缀判断,而非虚拟路径
- 确保 NAS/移动盘等不可达目录下的 CUE 分轨不被误删
@imsyy

imsyy commented Jul 6, 2026

Copy link
Copy Markdown
Member Author

@copilot 请重新审查最新提交,已修复不可达目录下 CUE 分轨误删的问题:\n1. 添加了 extractCuePath 函数从虚拟路径提取真实 cuePath\n2. 使用真实 cuePath 做目录前缀判断,确保 NAS/移动盘等不可达目录下的 CUE 分轨不被误删

Copilot AI review requested due to automatic review settings July 6, 2026 14:02
@imsyy imsyy removed the request for review from Copilot July 6, 2026 14:02

Copilot AI commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

@copilot 请重新审查最新提交,已修复不可达目录下 CUE 分轨误删的问题:\n1. 添加了 extractCuePath 函数从虚拟路径提取真实 cuePath\n2. 使用真实 cuePath 做目��...

已审查最新提交,逻辑正确:extractCuePath 从虚拟路径反解真实 cuePath,再用真实路径做 unavailableDirs 前缀判断,与 Rust 端保护逻辑一致。

顺手修了一个小问题:原正则 \d{2} 只匹配恰好 2 位数字,但 padStart(2, "0") 对轨号 ≥ 100 时输出 3 位,会导致 extractCuePath 返回 null 进而误删。已改为 \d+,commit fix: 修正 extractCuePath 正则以支持轨号 ≥ 100

Copilot finished work on behalf of imsyy July 6, 2026 14:03
@imsyy imsyy merged commit 228b0de into dev Jul 6, 2026
6 checks passed
@imsyy imsyy deleted the codex/cue-support branch July 6, 2026 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants